home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
QRZ! Ham Radio 8
/
QRZ Ham Radio Callsign Database - Volume 8.iso
/
mac
/
files
/
dsp
/
56000tar.z
/
56000tar
/
56000
/
fft
/
fftr2d.asm
< prev
next >
Wrap
Assembly Source File
|
1991-11-25
|
4KB
|
106 lines
;
; This program originally available on the Motorola DSP bulletin board.
; It is provided under a DISCLAMER OF WARRANTY available from
; Motorola DSP Operation, 6501 Wm. Cannon Drive W., Austin, Tx., 78735.
;
; Radix 2, In-Place, Decimation-In-Time FFT
; (using DSP56001 Y Data ROM sine-cosine tables).
;
; Last Update 08 Aug 86 Version 1.0
;
fftr2d macro points,data,coef,table
fftr2d ident 1,0
;
; Radix 2 Decimation in Time In-Place Fast Fourier Transform Routine
;
; Complex input and output data
; Real data in X memory
; Imaginary data in Y memory
; Normally ordered input data
; Bit reversed output data
; Coefficient lookup table
; Full cycle sinewave in Y memory
; Coefficient table can be generated by "sinewave" macro.
;
; This FFT version can directly use the sinewave table stored
; in the DSP56001 Y Data ROM for up to 256 point complex FFTs.
;
; Macro Call - fftr2d points,data,coef,table
;
; points number of points (2-32768, power of 2)
; data starting address of data buffer
; coef starting address of sinewave table
; table size of sinewave table
;
; Alters Data ALU Registers
; x1 x0 y1 y0
; a2 a1 a0 a
; b2 b1 b0 b
;
; Alters Address Registers
; r0 n0 m0
; r1 n1 m1
; n2
;
; r4 n4 m4
; r5 n5 m5
; r6 n6 m6
; r7 n7 m7
;
; Alters Program Control Registers
; pc sr
;
; Uses 6 locations on System Stack
;
; Latest Revision - August 8, 1986
;
page
move #points/2,n0 ;initialize butterflies per group
move #1,n2 ;initialize groups per pass
move #table/4,n6 ;initialize C pointer offset
move n6,n7
move #-1,m0 ;initialize A and B address modifiers
move m0,m1 ;for linear addressing
move m0,m4
move m0,m5
move m0,m7
move #0,m6 ;initialize C address modifier for
;reverse carry (bit-reversed) addressing
;
; Perform all FFT passes with triple nested DO loop
;
do #@cvi(@log(points)/@log(2)+0.5),_end_pass
move #data,r0 ;initialize A input pointer
move r0,r4 ;initialize A output pointer
lua (r0)+n0,r1 ;initialize B input pointer
move #coef,r6 ;initialize C input pointer
lua (r1)-,r5 ;initialize B output pointer
move n0,n1 ;initialize pointer offsets
move n0,n4
move n0,n5
do n2,_end_grp
move r6,r7 ;get sine pointer
move x:(r1),x1 y:(r6)+n6,y0 ;lookup sine value
move x:(r5),a y:(r0),b ;preload data
move y:(r7+n7),x0 ;lookup cosine value
do n0,_end_bfy ;Radix 2 DIT butterfly kernel
mac -x1,y0,b y:(r1)+,y1
macr x0,y1,b a,x:(r5)+ y:(r0),a
subl b,a x:(r0),b b,y:(r4)
mac x1,x0,b x:(r0)+,a a,y:(r5)
macr y1,y0,b x:(r1),x1
subl b,a b,x:(r4)+ y:(r0),b
_end_bfy
move a,x:(r5)+n5 y:(r1)+n1,y1 ;update A and B pointers
move x:(r0)+n0,x1 y:(r4)+n4,y1
_end_grp
move n0,b1
lsr b n2,a1 ;divide butterflies per group by two
lsl a b1,n0 ;multiply groups per pass by two
move a1,n2
_end_pass
endm